"""
    @Author  ：思念 
    @File    ：7.腾讯招聘内容写入MySQL.py
    @Date    ：2024/12/11 21:57 
"""
import requests
import pymysql

url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1733925418042&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=1&keyword=python&pageIndex={}&pageSize=10&language=zh-cn&area=cn'


class TxWork:
    """
    初始化类的构造方法。
    本方法主要用于初始化类的一些基本属性和连接数据库，为后续的数据抓取和处理做准备。
    """

    def __init__(self):
        # 初始化API的URL，用于后续的网络请求。
        self.api_url = url
        # 设置请求头，模拟浏览器的User-Agent，以避免某些网站的反爬虫机制。
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
        }
        # 连接本地MySQL数据库，用于存储抓取到的数据。
        # 注意：在实际使用中，应避免直接硬编码数据库密码，应使用更安全的方式处理敏感信息。
        self.db = pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            password='root',
            database='py_spider',
            charset='utf8'
        )
        # 创建数据库游标，用于执行SQL语句。
        self.cursor = self.db.cursor()

    """
    定义一个方法get_data，用于抓取和yield职位数据。
    此方法通过网络请求获取数据，并将解析后的职位列表数据yield出来。
    """

    def get_data(self):
        # 遍历1到10的数字，用于拼接API URL并发起请求。
        for i in range(1, 11):
            # 发起网络请求，获取网页内容。
            response = requests.get(url=self.api_url.format(i), headers=self.headers).json()
            # 解析JSON数据，获取职位列表。
            data_list = response['Data']['Posts']
            # 使用yield返回职位列表数据。
            yield data_list

    """
       创建数据库表。
    """

    def create_table(self):
        drop_sql = "DROP TABLE IF EXISTS tx_work;"
        create_sql = """
            CREATE TABLE tx_work(
                id int primary key auto_increment,
                work_name varchar(100) not null,
                country_name varchar(50),
                city_name varchar(50),
                work_desc text
            );
        """
        try:
            self.cursor.execute(drop_sql)
            print('删除表成功')
            self.cursor.execute(create_sql)
            print('创建表成功')

        except Exception as e:
            print('创建表失败')
            print(e)

    def close_db(self):
        self.cursor.close()
        self.db.close()
        print("关闭数据库，爬虫结束")

    def insert_data(self, *args):
        """
        :param
        data: id, work_name, country_name, city_name, work_desc
        :return:
        """
        sql = """
            insert
            into
            tx_work(id,work_name,country_name,city_name,work_desc)
            values( %s, %s, %s, %s, %s);
            """
        try:
            self.cursor.execute(sql, args)
            self.db.commit()
            print('插入数据成功')
        except Exception as e:
            print('插入数据失败')
            print(e)
            self.db.rollback()

    def main(self):
        self.create_table()
        tx_work_generator = self.get_data()
        work_id = 0
        for work_list in tx_work_generator:
            for work_info in work_list:
                work_id += 1
                work_name = work_info['RecruitPostName']
                country_name = work_info['CountryName']
                city_name = work_info['LocationName']
                work_desc = work_info['Responsibility']
                self.insert_data(work_id, work_name, country_name, city_name, work_desc)
        self.close_db()


if __name__ == '__main__':
    tx_work = TxWork()
    tx_work.main()
